home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / lysrc.zip / YACC.PAS < prev    next >
Pascal/Delphi Source File  |  1993-01-24  |  51KB  |  2,475 lines

  1.  
  2. (* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)
  3.  
  4. (* global definitions: *)
  5.  
  6.  
  7. {$X+}
  8. program Yacc;
  9.  
  10. (* Copyright (c) 1990,91 by Albert Graef, Schillerstr. 18,
  11.    6509 Schornsheim/Germany
  12.    All rights reserved *)
  13.  
  14. uses YaccLib, YaccBase, YaccMsgs, YaccSem, YaccTables, YaccParseTable;
  15.  
  16. (* TP Yacc - Yet Another Compiler Compiler for MS-DOS/Turbo Pascal
  17.  
  18.    Version 3.0 as of April 91
  19.    Version 3.0a as of May 92 (bug fixes in precedence and type information
  20.      updates)
  21.  
  22.    Author
  23.  
  24.    Albert Graef
  25.    Schillerstr. 18
  26.    6509 Schornsheim/Germany
  27.  
  28.    Graef@DMZRZU71.bitnet
  29.  
  30.    Synopsis   YACC [options] yacc-file[.Y] [output-file[.PAS]]
  31.  
  32.    Options
  33.  
  34.    /v  "Verbose:" Yacc generates a readable description of the generated
  35.        parser, written to yacc-file with new extension .LST.
  36.  
  37.    /d  "Debug:" Yacc generates parser with debugging output.
  38.  
  39.    Description
  40.  
  41.    This is a reimplementation of the popular UNIX compiler generator
  42.    Yacc for MS-DOS and Turbo Pascal.
  43.  
  44.    Differences from UNIX Yacc:
  45.  
  46.    - Produces output code for Turbo Pascal, rather than for C.
  47.  
  48.    - Does not support %union definitions. Instead, a value type is declared
  49.      by specifying the type identifier *itself* as the tag of a %token
  50.      or %type definition. Yacc will automatically generate an appropriate
  51.      yylval variable of a variant record type (YYSType) which is capable of
  52.      holding values of any of the types used in %token and %type.
  53.  
  54.      Type checking is *very* strict. If you use type definitions, then
  55.      any symbol referred to in an action *must* have a type introduced
  56.      in a type definition. Either the symbol must have been assigned a
  57.      type in the definitions section, or the $<type-identifier> notation
  58.      must be used. The syntax of the %type definition has been changed
  59.      slightly to allow definitions of the form
  60.        %type <type-identifier>
  61.      (omitting the nonterminals) which may be used to declare types which
  62.      are not assigned to any grammar symbol, but are used with the
  63.      $<...> construct.
  64.  
  65.    - The parse tables constructed by this Yacc version are slightly greater
  66.      than those constructed by UNIX Yacc, since a reduce action will only be
  67.      chosen as the default action if it is the *only* action in the state.
  68.      In difference, UNIX Yacc chooses a reduce action as the default action
  69.      whenever it is the only *reduce* action of the state (even if there are
  70.      other shift actions).
  71.  
  72.      This solves a bug in UNIX Yacc that makes the generated parser start
  73.      error recovery too late with certain types of error productions (see
  74.      also Schreiner/Friedman, "Introduction to compiler construction with
  75.      UNIX," 1985). Also, errors will be caught sooner in most cases where
  76.      standard Yacc would carry out an additional (default) reduction before
  77.      detecting the error.
  78.  
  79. *)
  80.  
  81. const ID = 257;
  82. const C_ID = 258;
  83. const LITERAL = 259;
  84. const LITID = 260;
  85. const NUMBER = 261;
  86. const PTOKEN = 262;
  87. const PLEFT = 263;
  88. const PRIGHT = 264;
  89. const PNONASSOC = 265;
  90. const PTYPE = 266;
  91. const PSTART = 267;
  92. const PPREC = 268;
  93. const PP = 269;
  94. const LCURL = 270;
  95. const RCURL = 271;
  96. const ILLEGAL = 272;
  97.  
  98. var yylval : YYSType;
  99.  
  100. function yylex : Integer; forward;
  101.  
  102. function yyparse : Integer;
  103.  
  104. var yystate, yysp, yyn : Integer;
  105.     yys : array [1..yymaxdepth] of Integer;
  106.     yyv : array [1..yymaxdepth] of YYSType;
  107.     yyval : YYSType;
  108.  
  109. procedure yyaction ( yyruleno : Integer );
  110.   (* local definitions: *)
  111. begin
  112.   (* actions: *)
  113.   case yyruleno of
  114.    1 : begin
  115.          yyval := yyv[yysp-0];
  116.        end;
  117.    2 : begin
  118.          yyval := yyv[yysp-0];
  119.        end;
  120.    3 : begin
  121.          yyval := yyv[yysp-0];
  122.        end;
  123.    4 : begin
  124.          yyval := yyv[yysp-0];
  125.        end;
  126.    5 : begin
  127.          yyval := yyv[yysp-0];
  128.        end;
  129.    6 : begin
  130.          yyerrok; 
  131.        end;
  132.    7 : begin
  133.          yyerrok; 
  134.        end;
  135.    8 : begin
  136.          yyerrok; 
  137.        end;
  138.    9 : begin
  139.          yyerrok; 
  140.        end;
  141.   10 : begin
  142.          yyerrok; 
  143.        end;
  144.   11 : begin
  145.          yyerrok; 
  146.        end;
  147.   12 : begin
  148.          yyval := yyv[yysp-0];
  149.        end;
  150.   13 : begin
  151.          yyerrok; 
  152.        end;
  153.   14 : begin
  154.          yyval := yyv[yysp-0];
  155.        end;
  156.   15 : begin
  157.          yyval := yyv[yysp-0];
  158.        end;
  159.   16 : begin
  160.          error(rcurl_expected); 
  161.        end;
  162.   17 : begin
  163.          yyval := yyv[yysp-0];
  164.        end;
  165.   18 : begin
  166.          yyerrok; 
  167.        end;
  168.   19 : begin
  169.          yyerrok; 
  170.        end;
  171.   20 : begin
  172.          yyerrok; 
  173.        end;
  174.   21 : begin
  175.          yyval := yyv[yysp-0];
  176.        end;
  177.   22 : begin
  178.          yyval := yyv[yysp-0];
  179.        end;
  180.   23 : begin
  181.          error(rbrace_expected); 
  182.        end;
  183.   24 : begin
  184.          yyval := yyv[yysp-0];
  185.        end;
  186.   25 : begin
  187.          yyval := yyv[yysp-0];
  188.        end;
  189.   26 : begin
  190.          error(rangle_expected); 
  191.        end;
  192.   27 : begin
  193.          yyval := yyv[yysp-0];
  194.        end;
  195.   28 : begin
  196.          sort_types;
  197.          definitions;
  198.          next_section; 
  199.        end;
  200.   29 : begin
  201.          next_section;
  202.          generate_parser;
  203.          next_section; 
  204.        end;
  205.   30 : begin
  206.          yyval := yyv[yysp-5];
  207.        end;
  208.   31 : begin
  209.        end;
  210.   32 : begin
  211.          copy_rest_of_file; 
  212.        end;
  213.   33 : begin
  214.        end;
  215.   34 : begin
  216.          yyerrok; 
  217.        end;
  218.   35 : begin
  219.          error(error_in_def); 
  220.        end;
  221.   36 : begin
  222.          startnt := ntsym(yyv[yysp-0]); 
  223.        end;
  224.   37 : begin
  225.          error(ident_expected); 
  226.        end;
  227.   38 : begin
  228.          copy_code; 
  229.        end;
  230.   39 : begin
  231.          yyval := yyv[yysp-2];
  232.        end;
  233.   40 : begin
  234.          act_prec := 0; 
  235.        end;
  236.   41 : begin
  237.          yyval := yyv[yysp-3];
  238.        end;
  239.   42 : begin
  240.          act_prec := new_prec_level(left); 
  241.        end;
  242.   43 : begin
  243.          yyval := yyv[yysp-3];
  244.        end;
  245.   44 : begin
  246.          act_prec := new_prec_level(right); 
  247.        end;
  248.   45 : begin
  249.          yyval := yyv[yysp-3];
  250.        end;
  251.   46 : begin
  252.          act_prec := new_prec_level(nonassoc); 
  253.        end;
  254.   47 : begin
  255.          yyval := yyv[yysp-3];
  256.        end;
  257.   48 : begin
  258.          yyval := yyv[yysp-2];
  259.        end;
  260.   49 : begin
  261.          yyval := yyv[yysp-1];
  262.        end;
  263.   50 : begin
  264.          act_type := 0; 
  265.        end;
  266.   51 : begin
  267.          act_type := yyv[yysp-1]; add_type(yyv[yysp-1]); 
  268.        end;
  269.   52 : begin
  270.          yyval := yyv[yysp-0];
  271.        end;
  272.   53 : begin
  273.          yyerrok; 
  274.        end;
  275.   54 : begin
  276.          yyerrok; 
  277.        end;
  278.   55 : begin
  279.          error(ident_expected); 
  280.        end;
  281.   56 : begin
  282.          error(error_in_def); 
  283.        end;
  284.   57 : begin
  285.          error(ident_expected); 
  286.        end;
  287.   58 : begin
  288.          if act_type<>0 then
  289.          sym_type^[yyv[yysp-0]] := act_type;
  290.          if act_prec<>0 then
  291.          sym_prec^[yyv[yysp-0]] := act_prec; 
  292.        end;
  293.   59 : begin
  294.          litsym(yyv[yysp-0], 0);
  295.          if act_type<>0 then
  296.          sym_type^[litsym(yyv[yysp-0], 0)] := act_type;
  297.          if act_prec<>0 then
  298.          sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; 
  299.        end;
  300.   60 : begin
  301.          litsym(yyv[yysp-0], 0);
  302.          if act_type<>0 then
  303.          sym_type^[litsym(yyv[yysp-0], 0)] := act_type;
  304.          if act_prec<>0 then
  305.          sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; 
  306.        end;
  307.   61 : begin
  308.          litsym(yyv[yysp-1], 0);
  309.          if act_type<>0 then
  310.          sym_type^[litsym(yyv[yysp-1], yyv[yysp-0])] := act_type;
  311.          if act_prec<>0 then
  312.          sym_prec^[litsym(yyv[yysp-1], 0)]  := act_prec; 
  313.        end;
  314.   62 : begin
  315.          litsym(yyv[yysp-1], 0);
  316.          if act_type<>0 then
  317.          sym_type^[litsym(yyv[yysp-1], yyv[yysp-0])] := act_type;
  318.          if act_prec<>0 then
  319.          sym_prec^[litsym(yyv[yysp-1], 0)]  := act_prec; 
  320.        end;
  321.   63 : begin
  322.          yyval := yyv[yysp-0];
  323.        end;
  324.   64 : begin
  325.          yyerrok; 
  326.        end;
  327.   65 : begin
  328.          yyerrok; 
  329.        end;
  330.   66 : begin
  331.          error(ident_expected); 
  332.        end;
  333.   67 : begin
  334.          error(error_in_def); 
  335.        end;
  336.   68 : begin
  337.          error(ident_expected); 
  338.        end;
  339.   69 : begin
  340.          if act_type<>0 then
  341.          sym_type^[ntsym(yyv[yysp-0])] := act_type; 
  342.        end;
  343.   70 : begin
  344.          next_section; 
  345.        end;
  346.   71 : begin
  347.          yyval := yyv[yysp-1];
  348.        end;
  349.   72 : begin
  350.          copy_code; 
  351.        end;
  352.   73 : begin
  353.          next_section; 
  354.        end;
  355.   74 : begin
  356.          yyval := yyv[yysp-4];
  357.        end;
  358.   75 : begin
  359.          yyerrok; 
  360.        end;
  361.   76 : begin
  362.          error(error_in_rule); 
  363.        end;
  364.   77 : begin
  365.          error(error_in_rule); 
  366.        end;
  367.   78 : begin
  368.          start_rule(ntsym(yyv[yysp-0])); 
  369.        end;
  370.   79 : begin
  371.          start_body; 
  372.        end;
  373.   80 : begin
  374.          end_body; 
  375.        end;
  376.   81 : begin
  377.          yyval := yyv[yysp-0];
  378.        end;
  379.   82 : begin
  380.          start_body; 
  381.        end;
  382.   83 : begin
  383.          end_body; 
  384.        end;
  385.   84 : begin
  386.        end;
  387.   85 : begin
  388.          add_symbol(yyv[yysp-0]); yyerrok; 
  389.        end;
  390.   86 : begin
  391.          add_symbol(sym(yyv[yysp-0])); yyerrok; 
  392.        end;
  393.   87 : begin
  394.          add_symbol(sym(yyv[yysp-0])); yyerrok; 
  395.        end;
  396.   88 : begin
  397.          add_action; yyerrok; 
  398.        end;
  399.   89 : begin
  400.          error(error_in_rule); 
  401.        end;
  402.   90 : begin
  403.          copy_action; 
  404.        end;
  405.   91 : begin
  406.          yyval := yyv[yysp-2];
  407.        end;
  408.   92 : begin
  409.          copy_single_action; 
  410.        end;
  411.   93 : begin
  412.        end;
  413.   94 : begin
  414.          add_rule_prec(yyv[yysp-0]); 
  415.        end;
  416.   95 : begin
  417.          yyval := yyv[yysp-3];
  418.        end;
  419.   96 : begin
  420.          add_rule_prec(litsym(yyv[yysp-0], 0)); 
  421.        end;
  422.   97 : begin
  423.          yyval := yyv[yysp-3];
  424.        end;
  425.   98 : begin
  426.          add_rule_prec(litsym(yyv[yysp-0], 0)); 
  427.        end;
  428.   99 : begin
  429.          yyval := yyv[yysp-3];
  430.        end;
  431.  100 : begin
  432.          yyval := yyv[yysp-1];
  433.        end;
  434.  101 : begin
  435.        end;
  436.  102 : begin
  437.          add_action; 
  438.        end;
  439.   end;
  440. end(*yyaction*);
  441.  
  442. (* parse table: *)
  443.  
  444. type YYARec = record
  445.                 sym, act : Integer;
  446.               end;
  447.      YYRRec = record
  448.                 len, sym : Integer;
  449.               end;
  450.  
  451. const
  452.  
  453. yynacts   = 251;
  454. yyngotos  = 146;
  455. yynstates = 128;
  456. yynrules  = 102;
  457.  
  458. yya : array [1..yynacts] of YYARec = (
  459. { 0: }
  460. { 1: }
  461.   ( sym: 256; act: 12 ),
  462.   ( sym: 262; act: 13 ),
  463.   ( sym: 263; act: 14 ),
  464.   ( sym: 264; act: 15 ),
  465.   ( sym: 265; act: 16 ),
  466.   ( sym: 266; act: 17 ),
  467.   ( sym: 267; act: 18 ),
  468.   ( sym: 269; act: 19 ),
  469.   ( sym: 270; act: 20 ),
  470. { 2: }
  471.   ( sym: 0; act: 0 ),
  472. { 3: }
  473. { 4: }
  474. { 5: }
  475. { 6: }
  476.   ( sym: 256; act: 24 ),
  477.   ( sym: 257; act: 25 ),
  478. { 7: }
  479.   ( sym: 60; act: 28 ),
  480.   ( sym: 256; act: -50 ),
  481.   ( sym: 257; act: -50 ),
  482.   ( sym: 262; act: -50 ),
  483.   ( sym: 263; act: -50 ),
  484.   ( sym: 264; act: -50 ),
  485.   ( sym: 265; act: -50 ),
  486.   ( sym: 266; act: -50 ),
  487.   ( sym: 267; act: -50 ),
  488.   ( sym: 269; act: -50 ),
  489.   ( sym: 270; act: -50 ),
  490. { 8: }
  491. { 9: }
  492. { 10: }
  493. { 11: }
  494. { 12: }
  495. { 13: }
  496. { 14: }
  497. { 15: }
  498. { 16: }
  499. { 17: }
  500. { 18: }
  501. { 19: }
  502. { 20: }
  503. { 21: }
  504.   ( sym: 256; act: 34 ),
  505.   ( sym: 271; act: 35 ),
  506. { 22: }
  507.   ( sym: 256; act: 39 ),
  508.   ( sym: 270; act: 20 ),
  509.   ( sym: 258; act: -70 ),
  510. { 23: }
  511. { 24: }
  512. { 25: }
  513. { 26: }
  514.   ( sym: 256; act: 43 ),
  515.   ( sym: 257; act: 25 ),
  516.   ( sym: 262; act: -49 ),
  517.   ( sym: 263; act: -49 ),
  518.   ( sym: 264; act: -49 ),
  519.   ( sym: 265; act: -49 ),
  520.   ( sym: 266; act: -49 ),
  521.   ( sym: 267; act: -49 ),
  522.   ( sym: 269; act: -49 ),
  523.   ( sym: 270; act: -49 ),
  524. { 27: }
  525.   ( sym: 257; act: 25 ),
  526. { 28: }
  527. { 29: }
  528.   ( sym: 60; act: 28 ),
  529.   ( sym: 256; act: -50 ),
  530.   ( sym: 257; act: -50 ),
  531.   ( sym: 259; act: -50 ),
  532.   ( sym: 260; act: -50 ),
  533. { 30: }
  534.   ( sym: 60; act: 28 ),
  535.   ( sym: 256; act: -50 ),
  536.   ( sym: 257; act: -50 ),
  537.   ( sym: 259; act: -50 ),
  538.   ( sym: 260; act: -50 ),
  539. { 31: }
  540.   ( sym: 60; act: 28 ),
  541.   ( sym: 256; act: -50 ),
  542.   ( sym: 257; act: -50 ),
  543.   ( sym: 259; act: -50 ),
  544.   ( sym: 260; act: -50 ),
  545. { 32: }
  546.   ( sym: 60; act: 28 ),
  547.   ( sym: 256; act: -50 ),
  548.   ( sym: 257; act: -50 ),
  549.   ( sym: 259; act: -50 ),
  550.   ( sym: 260; act: -50 ),
  551. { 33: }
  552. { 34: }
  553. { 35: }
  554. { 36: }
  555.   ( sym: 258; act: 51 ),
  556. { 37: }
  557.   ( sym: 124; act: 56 ),
  558.   ( sym: 256; act: 57 ),
  559.   ( sym: 258; act: 51 ),
  560.   ( sym: 0; act: -29 ),
  561.   ( sym: 269; act: -29 ),
  562. { 38: }
  563. { 39: }
  564. { 40: }
  565. { 41: }
  566.   ( sym: 44; act: 61 ),
  567.   ( sym: 256; act: 62 ),
  568.   ( sym: 257; act: 25 ),
  569.   ( sym: 262; act: -48 ),
  570.   ( sym: 263; act: -48 ),
  571.   ( sym: 264; act: -48 ),
  572.   ( sym: 265; act: -48 ),
  573.   ( sym: 266; act: -48 ),
  574.   ( sym: 267; act: -48 ),
  575.   ( sym: 269; act: -48 ),
  576.   ( sym: 270; act: -48 ),
  577. { 42: }
  578. { 43: }
  579. { 44: }
  580.   ( sym: 62; act: 64 ),
  581.   ( sym: 256; act: 65 ),
  582. { 45: }
  583.   ( sym: 256; act: 71 ),
  584.   ( sym: 257; act: 25 ),
  585.   ( sym: 259; act: 72 ),
  586.   ( sym: 260; act: 73 ),
  587. { 46: }
  588.   ( sym: 256; act: 71 ),
  589.   ( sym: 257; act: 25 ),
  590.   ( sym: 259; act: 72 ),
  591.   ( sym: 260; act: 73 ),
  592. { 47: }
  593.   ( sym: 256; act: 71 ),
  594.   ( sym: 257; act: 25 ),
  595.   ( sym: 259; act: 72 ),
  596.   ( sym: 260; act: 73 ),
  597. { 48: }
  598.   ( sym: 256; act: 71 ),
  599.   ( sym: 257; act: 25 ),
  600.   ( sym: 259; act: 72 ),
  601.   ( sym: 260; act: 73 ),
  602. { 49: }
  603. { 50: }
  604. { 51: }
  605. { 52: }
  606. { 53: }
  607. { 54: }
  608.   ( sym: 269; act: 19 ),
  609.   ( sym: 0; act: -31 ),
  610. { 55: }
  611. { 56: }
  612. { 57: }
  613. { 58: }
  614.   ( sym: 256; act: 34 ),
  615.   ( sym: 271; act: 35 ),
  616. { 59: }
  617. { 60: }
  618.   ( sym: 256; act: 83 ),
  619.   ( sym: 257; act: 25 ),
  620. { 61: }
  621. { 62: }
  622. { 63: }
  623. { 64: }
  624. { 65: }
  625. { 66: }
  626. { 67: }
  627.   ( sym: 44; act: 61 ),
  628.   ( sym: 256; act: 86 ),
  629.   ( sym: 257; act: 25 ),
  630.   ( sym: 259; act: 72 ),
  631.   ( sym: 260; act: 73 ),
  632.   ( sym: 262; act: -47 ),
  633.   ( sym: 263; act: -47 ),
  634.   ( sym: 264; act: -47 ),
  635.   ( sym: 265; act: -47 ),
  636.   ( sym: 266; act: -47 ),
  637.   ( sym: 267; act: -47 ),
  638.   ( sym: 269; act: -47 ),
  639.   ( sym: 270; act: -47 ),
  640. { 68: }
  641.   ( sym: 261; act: 88 ),
  642.   ( sym: 44; act: -59 ),
  643.   ( sym: 256; act: -59 ),
  644.   ( sym: 257; act: -59 ),
  645.   ( sym: 259; act: -59 ),
  646.   ( sym: 260; act: -59 ),
  647.   ( sym: 262; act: -59 ),
  648.   ( sym: 263; act: -59 ),
  649.   ( sym: 264; act: -59 ),
  650.   ( sym: 265; act: -59 ),
  651.   ( sym: 266; act: -59 ),
  652.   ( sym: 267; act: -59 ),
  653.   ( sym: 269; act: -59 ),
  654.   ( sym: 270; act: -59 ),
  655. { 69: }
  656. { 70: }
  657.   ( sym: 261; act: 88 ),
  658.   ( sym: 44; act: -60 ),
  659.   ( sym: 256; act: -60 ),
  660.   ( sym: 257; act: -60 ),
  661.   ( sym: 259; act: -60 ),
  662.   ( sym: 260; act: -60 ),
  663.   ( sym: 262; act: -60 ),
  664.   ( sym: 263; act: -60 ),
  665.   ( sym: 264; act: -60 ),
  666.   ( sym: 265; act: -60 ),
  667.   ( sym: 266; act: -60 ),
  668.   ( sym: 267; act: -60 ),
  669.   ( sym: 269; act: -60 ),
  670.   ( sym: 270; act: -60 ),
  671. { 71: }
  672. { 72: }
  673. { 73: }
  674. { 74: }
  675.   ( sym: 44; act: 61 ),
  676.   ( sym: 256; act: 86 ),
  677.   ( sym: 257; act: 25 ),
  678.   ( sym: 259; act: 72 ),
  679.   ( sym: 260; act: 73 ),
  680.   ( sym: 262; act: -45 ),
  681.   ( sym: 263; act: -45 ),
  682.   ( sym: 264; act: -45 ),
  683.   ( sym: 265; act: -45 ),
  684.   ( sym: 266; act: -45 ),
  685.   ( sym: 267; act: -45 ),
  686.   ( sym: 269; act: -45 ),
  687.   ( sym: 270; act: -45 ),
  688. { 75: }
  689.   ( sym: 44; act: 61 ),
  690.   ( sym: 256; act: 86 ),
  691.   ( sym: 257; act: 25 ),
  692.   ( sym: 259; act: 72 ),
  693.   ( sym: 260; act: 73 ),
  694.   ( sym: 262; act: -43 ),
  695.   ( sym: 263; act: -43 ),
  696.   ( sym: 264; act: -43 ),
  697.   ( sym: 265; act: -43 ),
  698.   ( sym: 266; act: -43 ),
  699.   ( sym: 267; act: -43 ),
  700.   ( sym: 269; act: -43 ),
  701.   ( sym: 270; act: -43 ),
  702. { 76: }
  703.   ( sym: 44; act: 61 ),
  704.   ( sym: 256; act: 86 ),
  705.   ( sym: 257; act: 25 ),
  706.   ( sym: 259; act: 72 ),
  707.   ( sym: 260; act: 73 ),
  708.   ( sym: 262; act: -41 ),
  709.   ( sym: 263; act: -41 ),
  710.   ( sym: 264; act: -41 ),
  711.   ( sym: 265; act: -41 ),
  712.   ( sym: 266; act: -41 ),
  713.   ( sym: 267; act: -41 ),
  714.   ( sym: 269; act: -41 ),
  715.   ( sym: 270; act: -41 ),
  716. { 77: }
  717.   ( sym: 58; act: 91 ),
  718. { 78: }
  719. { 79: }
  720. { 80: }
  721. { 81: }
  722. { 82: }
  723. { 83: }
  724. { 84: }
  725. { 85: }
  726.   ( sym: 256; act: 95 ),
  727.   ( sym: 257; act: 25 ),
  728.   ( sym: 259; act: 72 ),
  729.   ( sym: 260; act: 73 ),
  730. { 86: }
  731. { 87: }
  732. { 88: }
  733. { 89: }
  734. { 90: }
  735. { 91: }
  736. { 92: }
  737.   ( sym: 61; act: 105 ),
  738.   ( sym: 123; act: 106 ),
  739.   ( sym: 256; act: 107 ),
  740.   ( sym: 257; act: 25 ),
  741.   ( sym: 259; act: 72 ),
  742.   ( sym: 260; act: 73 ),
  743.   ( sym: 268; act: 108 ),
  744.   ( sym: 0; act: -93 ),
  745.   ( sym: 59; act: -93 ),
  746.   ( sym: 124; act: -93 ),
  747.   ( sym: 258; act: -93 ),
  748.   ( sym: 269; act: -93 ),
  749. { 93: }
  750.   ( sym: 258; act: 51 ),
  751. { 94: }
  752. { 95: }
  753. { 96: }
  754. { 97: }
  755. { 98: }
  756.   ( sym: 59; act: 112 ),
  757.   ( sym: 0; act: -83 ),
  758.   ( sym: 124; act: -83 ),
  759.   ( sym: 256; act: -83 ),
  760.   ( sym: 258; act: -83 ),
  761.   ( sym: 269; act: -83 ),
  762. { 99: }
  763. { 100: }
  764. { 101: }
  765.   ( sym: 257; act: 25 ),
  766.   ( sym: 259; act: 72 ),
  767.   ( sym: 260; act: 73 ),
  768. { 102: }
  769. { 103: }
  770. { 104: }
  771. { 105: }
  772. { 106: }
  773. { 107: }
  774. { 108: }
  775. { 109: }
  776. { 110: }
  777.   ( sym: 61; act: 105 ),
  778.   ( sym: 123; act: 106 ),
  779.   ( sym: 256; act: 107 ),
  780.   ( sym: 257; act: 25 ),
  781.   ( sym: 259; act: 72 ),
  782.   ( sym: 260; act: 73 ),
  783.   ( sym: 268; act: 108 ),
  784.   ( sym: 0; act: -93 ),
  785.   ( sym: 59; act: -93 ),
  786.   ( sym: 124; act: -93 ),
  787.   ( sym: 258; act: -93 ),
  788.   ( sym: 269; act: -93 ),
  789. { 111: }
  790. { 112: }
  791. { 113: }
  792.   ( sym: 125; act: 119 ),
  793.   ( sym: 256; act: 120 ),
  794. { 114: }
  795. { 115: }
  796. { 116: }
  797. { 117: }
  798.   ( sym: 59; act: 112 ),
  799.   ( sym: 0; act: -80 ),
  800.   ( sym: 124; act: -80 ),
  801.   ( sym: 256; act: -80 ),
  802.   ( sym: 258; act: -80 ),
  803.   ( sym: 269; act: -80 ),
  804. { 118: }
  805. { 119: }
  806. { 120: }
  807. { 121: }
  808.   ( sym: 61; act: 105 ),
  809.   ( sym: 123; act: 106 ),
  810.   ( sym: 0; act: -101 ),
  811.   ( sym: 59; act: -101 ),
  812.   ( sym: 124; act: -101 ),
  813.   ( sym: 256; act: -101 ),
  814.   ( sym: 258; act: -101 ),
  815.   ( sym: 269; act: -101 ),
  816. { 122: }
  817.   ( sym: 61; act: 105 ),
  818.   ( sym: 123; act: 106 ),
  819.   ( sym: 0; act: -101 ),
  820.   ( sym: 59; act: -101 ),
  821.   ( sym: 124; act: -101 ),
  822.   ( sym: 256; act: -101 ),
  823.   ( sym: 258; act: -101 ),
  824.   ( sym: 269; act: -101 ),
  825. { 123: }
  826.   ( sym: 61; act: 105 ),
  827.   ( sym: 123; act: 106 ),
  828.   ( sym: 0; act: -101 ),
  829.   ( sym: 59; act: -101 ),
  830.   ( sym: 124; act: -101 ),
  831.   ( sym: 256; act: -101 ),
  832.   ( sym: 258; act: -101 ),
  833.   ( sym: 269; act: -101 )
  834. { 124: }
  835. { 125: }
  836. { 126: }
  837. { 127: }
  838. );
  839.  
  840. yyg : array [1..yyngotos] of YYARec = (
  841. { 0: }
  842.   ( sym: -27; act: 1 ),
  843.   ( sym: -2; act: 2 ),
  844. { 1: }
  845.   ( sym: -32; act: 3 ),
  846.   ( sym: -16; act: 4 ),
  847.   ( sym: -15; act: 5 ),
  848.   ( sym: -13; act: 6 ),
  849.   ( sym: -12; act: 7 ),
  850.   ( sym: -11; act: 8 ),
  851.   ( sym: -10; act: 9 ),
  852.   ( sym: -9; act: 10 ),
  853.   ( sym: -8; act: 11 ),
  854. { 2: }
  855. { 3: }
  856. { 4: }
  857.   ( sym: -33; act: 21 ),
  858. { 5: }
  859.   ( sym: -29; act: 22 ),
  860. { 6: }
  861.   ( sym: -3; act: 23 ),
  862. { 7: }
  863.   ( sym: -34; act: 26 ),
  864.   ( sym: -24; act: 27 ),
  865. { 8: }
  866.   ( sym: -39; act: 29 ),
  867. { 9: }
  868.   ( sym: -38; act: 30 ),
  869. { 10: }
  870.   ( sym: -37; act: 31 ),
  871. { 11: }
  872.   ( sym: -35; act: 32 ),
  873. { 12: }
  874. { 13: }
  875. { 14: }
  876. { 15: }
  877. { 16: }
  878. { 17: }
  879. { 18: }
  880. { 19: }
  881. { 20: }
  882. { 21: }
  883.   ( sym: -17; act: 33 ),
  884. { 22: }
  885.   ( sym: -44; act: 36 ),
  886.   ( sym: -28; act: 37 ),
  887.   ( sym: -16; act: 38 ),
  888. { 23: }
  889. { 24: }
  890. { 25: }
  891. { 26: }
  892.   ( sym: -42; act: 40 ),
  893.   ( sym: -40; act: 41 ),
  894.   ( sym: -3; act: 42 ),
  895. { 27: }
  896.   ( sym: -3; act: 44 ),
  897. { 28: }
  898. { 29: }
  899.   ( sym: -34; act: 45 ),
  900.   ( sym: -24; act: 27 ),
  901. { 30: }
  902.   ( sym: -34; act: 46 ),
  903.   ( sym: -24; act: 27 ),
  904. { 31: }
  905.   ( sym: -34; act: 47 ),
  906.   ( sym: -24; act: 27 ),
  907. { 32: }
  908.   ( sym: -34; act: 48 ),
  909.   ( sym: -24; act: 27 ),
  910. { 33: }
  911. { 34: }
  912. { 35: }
  913. { 36: }
  914.   ( sym: -43; act: 49 ),
  915.   ( sym: -4; act: 50 ),
  916. { 37: }
  917.   ( sym: -47; act: 52 ),
  918.   ( sym: -43; act: 53 ),
  919.   ( sym: -31; act: 54 ),
  920.   ( sym: -21; act: 55 ),
  921.   ( sym: -4; act: 50 ),
  922. { 38: }
  923.   ( sym: -45; act: 58 ),
  924. { 39: }
  925. { 40: }
  926. { 41: }
  927.   ( sym: -42; act: 59 ),
  928.   ( sym: -18; act: 60 ),
  929.   ( sym: -3; act: 42 ),
  930. { 42: }
  931. { 43: }
  932. { 44: }
  933.   ( sym: -25; act: 63 ),
  934. { 45: }
  935.   ( sym: -41; act: 66 ),
  936.   ( sym: -36; act: 67 ),
  937.   ( sym: -6; act: 68 ),
  938.   ( sym: -5; act: 69 ),
  939.   ( sym: -3; act: 70 ),
  940. { 46: }
  941.   ( sym: -41; act: 66 ),
  942.   ( sym: -36; act: 74 ),
  943.   ( sym: -6; act: 68 ),
  944.   ( sym: -5; act: 69 ),
  945.   ( sym: -3; act: 70 ),
  946. { 47: }
  947.   ( sym: -41; act: 66 ),
  948.   ( sym: -36; act: 75 ),
  949.   ( sym: -6; act: 68 ),
  950.   ( sym: -5; act: 69 ),
  951.   ( sym: -3; act: 70 ),
  952. { 48: }
  953.   ( sym: -41; act: 66 ),
  954.   ( sym: -36; act: 76 ),
  955.   ( sym: -6; act: 68 ),
  956.   ( sym: -5; act: 69 ),
  957.   ( sym: -3; act: 70 ),
  958. { 49: }
  959. { 50: }
  960.   ( sym: -48; act: 77 ),
  961. { 51: }
  962. { 52: }
  963. { 53: }
  964. { 54: }
  965.   ( sym: -30; act: 78 ),
  966.   ( sym: -15; act: 79 ),
  967. { 55: }
  968.   ( sym: -52; act: 80 ),
  969. { 56: }
  970. { 57: }
  971. { 58: }
  972.   ( sym: -17; act: 81 ),
  973. { 59: }
  974. { 60: }
  975.   ( sym: -42; act: 82 ),
  976.   ( sym: -3; act: 42 ),
  977. { 61: }
  978. { 62: }
  979. { 63: }
  980. { 64: }
  981. { 65: }
  982. { 66: }
  983. { 67: }
  984.   ( sym: -41; act: 84 ),
  985.   ( sym: -18; act: 85 ),
  986.   ( sym: -6; act: 68 ),
  987.   ( sym: -5; act: 69 ),
  988.   ( sym: -3; act: 70 ),
  989. { 68: }
  990.   ( sym: -7; act: 87 ),
  991. { 69: }
  992. { 70: }
  993.   ( sym: -7; act: 89 ),
  994. { 71: }
  995. { 72: }
  996. { 73: }
  997. { 74: }
  998.   ( sym: -41; act: 84 ),
  999.   ( sym: -18; act: 85 ),
  1000.   ( sym: -6; act: 68 ),
  1001.   ( sym: -5; act: 69 ),
  1002.   ( sym: -3; act: 70 ),
  1003. { 75: }
  1004.   ( sym: -41; act: 84 ),
  1005.   ( sym: -18; act: 85 ),
  1006.   ( sym: -6; act: 68 ),
  1007.   ( sym: -5; act: 69 ),
  1008.   ( sym: -3; act: 70 ),
  1009. { 76: }
  1010.   ( sym: -41; act: 84 ),
  1011.   ( sym: -18; act: 85 ),
  1012.   ( sym: -6; act: 68 ),
  1013.   ( sym: -5; act: 69 ),
  1014.   ( sym: -3; act: 70 ),
  1015. { 77: }
  1016.   ( sym: -19; act: 90 ),
  1017. { 78: }
  1018. { 79: }
  1019. { 80: }
  1020.   ( sym: -49; act: 92 ),
  1021. { 81: }
  1022.   ( sym: -46; act: 93 ),
  1023. { 82: }
  1024. { 83: }
  1025. { 84: }
  1026. { 85: }
  1027.   ( sym: -41; act: 94 ),
  1028.   ( sym: -6; act: 68 ),
  1029.   ( sym: -5; act: 69 ),
  1030.   ( sym: -3; act: 70 ),
  1031. { 86: }
  1032. { 87: }
  1033. { 88: }
  1034. { 89: }
  1035. { 90: }
  1036.   ( sym: -50; act: 96 ),
  1037. { 91: }
  1038. { 92: }
  1039.   ( sym: -53; act: 97 ),
  1040.   ( sym: -51; act: 98 ),
  1041.   ( sym: -26; act: 99 ),
  1042.   ( sym: -22; act: 100 ),
  1043.   ( sym: -14; act: 101 ),
  1044.   ( sym: -6; act: 102 ),
  1045.   ( sym: -5; act: 103 ),
  1046.   ( sym: -3; act: 104 ),
  1047. { 93: }
  1048.   ( sym: -43; act: 109 ),
  1049.   ( sym: -4; act: 50 ),
  1050. { 94: }
  1051. { 95: }
  1052. { 96: }
  1053.   ( sym: -49; act: 110 ),
  1054. { 97: }
  1055. { 98: }
  1056.   ( sym: -20; act: 111 ),
  1057. { 99: }
  1058. { 100: }
  1059.   ( sym: -54; act: 113 ),
  1060. { 101: }
  1061.   ( sym: -6; act: 114 ),
  1062.   ( sym: -5; act: 115 ),
  1063.   ( sym: -3; act: 116 ),
  1064. { 102: }
  1065. { 103: }
  1066. { 104: }
  1067. { 105: }
  1068. { 106: }
  1069. { 107: }
  1070. { 108: }
  1071. { 109: }
  1072. { 110: }
  1073.   ( sym: -53; act: 97 ),
  1074.   ( sym: -51; act: 117 ),
  1075.   ( sym: -26; act: 99 ),
  1076.   ( sym: -22; act: 100 ),
  1077.   ( sym: -14; act: 101 ),
  1078.   ( sym: -6; act: 102 ),
  1079.   ( sym: -5; act: 103 ),
  1080.   ( sym: -3; act: 104 ),
  1081. { 111: }
  1082. { 112: }
  1083. { 113: }
  1084.   ( sym: -23; act: 118 ),
  1085. { 114: }
  1086.   ( sym: -57; act: 121 ),
  1087. { 115: }
  1088.   ( sym: -56; act: 122 ),
  1089. { 116: }
  1090.   ( sym: -58; act: 123 ),
  1091. { 117: }
  1092.   ( sym: -20; act: 111 ),
  1093. { 118: }
  1094. { 119: }
  1095. { 120: }
  1096. { 121: }
  1097.   ( sym: -55; act: 124 ),
  1098.   ( sym: -53; act: 125 ),
  1099.   ( sym: -26; act: 99 ),
  1100.   ( sym: -22; act: 100 ),
  1101. { 122: }
  1102.   ( sym: -55; act: 126 ),
  1103.   ( sym: -53; act: 125 ),
  1104.   ( sym: -26; act: 99 ),
  1105.   ( sym: -22; act: 100 ),
  1106. { 123: }
  1107.   ( sym: -55; act: 127 ),
  1108.   ( sym: -53; act: 125 ),
  1109.   ( sym: -26; act: 99 ),
  1110.   ( sym: -22; act: 100 )
  1111. { 124: }
  1112. { 125: }
  1113. { 126: }
  1114. { 127: }
  1115. );
  1116.  
  1117. yyd : array [0..yynstates-1] of Integer = (
  1118. { 0: } -33,
  1119. { 1: } 0,
  1120. { 2: } 0,
  1121. { 3: } -34,
  1122. { 4: } -38,
  1123. { 5: } -28,
  1124. { 6: } 0,
  1125. { 7: } 0,
  1126. { 8: } -46,
  1127. { 9: } -44,
  1128. { 10: } -42,
  1129. { 11: } -40,
  1130. { 12: } -35,
  1131. { 13: } -6,
  1132. { 14: } -7,
  1133. { 15: } -8,
  1134. { 16: } -9,
  1135. { 17: } -10,
  1136. { 18: } -11,
  1137. { 19: } -13,
  1138. { 20: } -14,
  1139. { 21: } 0,
  1140. { 22: } 0,
  1141. { 23: } -36,
  1142. { 24: } -37,
  1143. { 25: } -1,
  1144. { 26: } 0,
  1145. { 27: } 0,
  1146. { 28: } -24,
  1147. { 29: } 0,
  1148. { 30: } 0,
  1149. { 31: } 0,
  1150. { 32: } 0,
  1151. { 33: } -39,
  1152. { 34: } -16,
  1153. { 35: } -15,
  1154. { 36: } 0,
  1155. { 37: } 0,
  1156. { 38: } -72,
  1157. { 39: } -76,
  1158. { 40: } -63,
  1159. { 41: } 0,
  1160. { 42: } -69,
  1161. { 43: } -66,
  1162. { 44: } 0,
  1163. { 45: } 0,
  1164. { 46: } 0,
  1165. { 47: } 0,
  1166. { 48: } 0,
  1167. { 49: } -71,
  1168. { 50: } -78,
  1169. { 51: } -2,
  1170. { 52: } -75,
  1171. { 53: } -81,
  1172. { 54: } 0,
  1173. { 55: } -82,
  1174. { 56: } -20,
  1175. { 57: } -77,
  1176. { 58: } 0,
  1177. { 59: } -64,
  1178. { 60: } 0,
  1179. { 61: } -17,
  1180. { 62: } -67,
  1181. { 63: } -51,
  1182. { 64: } -25,
  1183. { 65: } -26,
  1184. { 66: } -52,
  1185. { 67: } 0,
  1186. { 68: } 0,
  1187. { 69: } -58,
  1188. { 70: } 0,
  1189. { 71: } -55,
  1190. { 72: } -3,
  1191. { 73: } -4,
  1192. { 74: } 0,
  1193. { 75: } 0,
  1194. { 76: } 0,
  1195. { 77: } 0,
  1196. { 78: } -30,
  1197. { 79: } -32,
  1198. { 80: } -84,
  1199. { 81: } -73,
  1200. { 82: } -65,
  1201. { 83: } -68,
  1202. { 84: } -53,
  1203. { 85: } 0,
  1204. { 86: } -56,
  1205. { 87: } -61,
  1206. { 88: } -5,
  1207. { 89: } -62,
  1208. { 90: } -79,
  1209. { 91: } -18,
  1210. { 92: } 0,
  1211. { 93: } 0,
  1212. { 94: } -54,
  1213. { 95: } -57,
  1214. { 96: } -84,
  1215. { 97: } -88,
  1216. { 98: } 0,
  1217. { 99: } -92,
  1218. { 100: } -90,
  1219. { 101: } 0,
  1220. { 102: } -86,
  1221. { 103: } -85,
  1222. { 104: } -87,
  1223. { 105: } -27,
  1224. { 106: } -21,
  1225. { 107: } -89,
  1226. { 108: } -12,
  1227. { 109: } -74,
  1228. { 110: } 0,
  1229. { 111: } -100,
  1230. { 112: } -19,
  1231. { 113: } 0,
  1232. { 114: } -96,
  1233. { 115: } -94,
  1234. { 116: } -98,
  1235. { 117: } 0,
  1236. { 118: } -91,
  1237. { 119: } -22,
  1238. { 120: } -23,
  1239. { 121: } 0,
  1240. { 122: } 0,
  1241. { 123: } 0,
  1242. { 124: } -97,
  1243. { 125: } -102,
  1244. { 126: } -95,
  1245. { 127: } -99
  1246. );
  1247.  
  1248. yyal : array [0..yynstates-1] of Integer = (
  1249. { 0: } 1,
  1250. { 1: } 1,
  1251. { 2: } 10,
  1252. { 3: } 11,
  1253. { 4: } 11,
  1254. { 5: } 11,
  1255. { 6: } 11,
  1256. { 7: } 13,
  1257. { 8: } 24,
  1258. { 9: } 24,
  1259. { 10: } 24,
  1260. { 11: } 24,
  1261. { 12: } 24,
  1262. { 13: } 24,
  1263. { 14: } 24,
  1264. { 15: } 24,
  1265. { 16: } 24,
  1266. { 17: } 24,
  1267. { 18: } 24,
  1268. { 19: } 24,
  1269. { 20: } 24,
  1270. { 21: } 24,
  1271. { 22: } 26,
  1272. { 23: } 29,
  1273. { 24: } 29,
  1274. { 25: } 29,
  1275. { 26: } 29,
  1276. { 27: } 39,
  1277. { 28: } 40,
  1278. { 29: } 40,
  1279. { 30: } 45,
  1280. { 31: } 50,
  1281. { 32: } 55,
  1282. { 33: } 60,
  1283. { 34: } 60,
  1284. { 35: } 60,
  1285. { 36: } 60,
  1286. { 37: } 61,
  1287. { 38: } 66,
  1288. { 39: } 66,
  1289. { 40: } 66,
  1290. { 41: } 66,
  1291. { 42: } 77,
  1292. { 43: } 77,
  1293. { 44: } 77,
  1294. { 45: } 79,
  1295. { 46: } 83,
  1296. { 47: } 87,
  1297. { 48: } 91,
  1298. { 49: } 95,
  1299. { 50: } 95,
  1300. { 51: } 95,
  1301. { 52: } 95,
  1302. { 53: } 95,
  1303. { 54: } 95,
  1304. { 55: } 97,
  1305. { 56: } 97,
  1306. { 57: } 97,
  1307. { 58: } 97,
  1308. { 59: } 99,
  1309. { 60: } 99,
  1310. { 61: } 101,
  1311. { 62: } 101,
  1312. { 63: } 101,
  1313. { 64: } 101,
  1314. { 65: } 101,
  1315. { 66: } 101,
  1316. { 67: } 101,
  1317. { 68: } 114,
  1318. { 69: } 128,
  1319. { 70: } 128,
  1320. { 71: } 142,
  1321. { 72: } 142,
  1322. { 73: } 142,
  1323. { 74: } 142,
  1324. { 75: } 155,
  1325. { 76: } 168,
  1326. { 77: } 181,
  1327. { 78: } 182,
  1328. { 79: } 182,
  1329. { 80: } 182,
  1330. { 81: } 182,
  1331. { 82: } 182,
  1332. { 83: } 182,
  1333. { 84: } 182,
  1334. { 85: } 182,
  1335. { 86: } 186,
  1336. { 87: } 186,
  1337. { 88: } 186,
  1338. { 89: } 186,
  1339. { 90: } 186,
  1340. { 91: } 186,
  1341. { 92: } 186,
  1342. { 93: } 198,
  1343. { 94: } 199,
  1344. { 95: } 199,
  1345. { 96: } 199,
  1346. { 97: } 199,
  1347. { 98: } 199,
  1348. { 99: } 205,
  1349. { 100: } 205,
  1350. { 101: } 205,
  1351. { 102: } 208,
  1352. { 103: } 208,
  1353. { 104: } 208,
  1354. { 105: } 208,
  1355. { 106: } 208,
  1356. { 107: } 208,
  1357. { 108: } 208,
  1358. { 109: } 208,
  1359. { 110: } 208,
  1360. { 111: } 220,
  1361. { 112: } 220,
  1362. { 113: } 220,
  1363. { 114: } 222,
  1364. { 115: } 222,
  1365. { 116: } 222,
  1366. { 117: } 222,
  1367. { 118: } 228,
  1368. { 119: } 228,
  1369. { 120: } 228,
  1370. { 121: } 228,
  1371. { 122: } 236,
  1372. { 123: } 244,
  1373. { 124: } 252,
  1374. { 125: } 252,
  1375. { 126: } 252,
  1376. { 127: } 252
  1377. );
  1378.  
  1379. yyah : array [0..yynstates-1] of Integer = (
  1380. { 0: } 0,
  1381. { 1: } 9,
  1382. { 2: } 10,
  1383. { 3: } 10,
  1384. { 4: } 10,
  1385. { 5: } 10,
  1386. { 6: } 12,
  1387. { 7: } 23,
  1388. { 8: } 23,
  1389. { 9: } 23,
  1390. { 10: } 23,
  1391. { 11: } 23,
  1392. { 12: } 23,
  1393. { 13: } 23,
  1394. { 14: } 23,
  1395. { 15: } 23,
  1396. { 16: } 23,
  1397. { 17: } 23,
  1398. { 18: } 23,
  1399. { 19: } 23,
  1400. { 20: } 23,
  1401. { 21: } 25,
  1402. { 22: } 28,
  1403. { 23: } 28,
  1404. { 24: } 28,
  1405. { 25: } 28,
  1406. { 26: } 38,
  1407. { 27: } 39,
  1408. { 28: } 39,
  1409. { 29: } 44,
  1410. { 30: } 49,
  1411. { 31: } 54,
  1412. { 32: } 59,
  1413. { 33: } 59,
  1414. { 34: } 59,
  1415. { 35: } 59,
  1416. { 36: } 60,
  1417. { 37: } 65,
  1418. { 38: } 65,
  1419. { 39: } 65,
  1420. { 40: } 65,
  1421. { 41: } 76,
  1422. { 42: } 76,
  1423. { 43: } 76,
  1424. { 44: } 78,
  1425. { 45: } 82,
  1426. { 46: } 86,
  1427. { 47: } 90,
  1428. { 48: } 94,
  1429. { 49: } 94,
  1430. { 50: } 94,
  1431. { 51: } 94,
  1432. { 52: } 94,
  1433. { 53: } 94,
  1434. { 54: } 96,
  1435. { 55: } 96,
  1436. { 56: } 96,
  1437. { 57: } 96,
  1438. { 58: } 98,
  1439. { 59: } 98,
  1440. { 60: } 100,
  1441. { 61: } 100,
  1442. { 62: } 100,
  1443. { 63: } 100,
  1444. { 64: } 100,
  1445. { 65: } 100,
  1446. { 66: } 100,
  1447. { 67: } 113,
  1448. { 68: } 127,
  1449. { 69: } 127,
  1450. { 70: } 141,
  1451. { 71: } 141,
  1452. { 72: } 141,
  1453. { 73: } 141,
  1454. { 74: } 154,
  1455. { 75: } 167,
  1456. { 76: } 180,
  1457. { 77: } 181,
  1458. { 78: } 181,
  1459. { 79: } 181,
  1460. { 80: } 181,
  1461. { 81: } 181,
  1462. { 82: } 181,
  1463. { 83: } 181,
  1464. { 84: } 181,
  1465. { 85: } 185,
  1466. { 86: } 185,
  1467. { 87: } 185,
  1468. { 88: } 185,
  1469. { 89: } 185,
  1470. { 90: } 185,
  1471. { 91: } 185,
  1472. { 92: } 197,
  1473. { 93: } 198,
  1474. { 94: } 198,
  1475. { 95: } 198,
  1476. { 96: } 198,
  1477. { 97: } 198,
  1478. { 98: } 204,
  1479. { 99: } 204,
  1480. { 100: } 204,
  1481. { 101: } 207,
  1482. { 102: } 207,
  1483. { 103: } 207,
  1484. { 104: } 207,
  1485. { 105: } 207,
  1486. { 106: } 207,
  1487. { 107: } 207,
  1488. { 108: } 207,
  1489. { 109: } 207,
  1490. { 110: } 219,
  1491. { 111: } 219,
  1492. { 112: } 219,
  1493. { 113: } 221,
  1494. { 114: } 221,
  1495. { 115: } 221,
  1496. { 116: } 221,
  1497. { 117: } 227,
  1498. { 118: } 227,
  1499. { 119: } 227,
  1500. { 120: } 227,
  1501. { 121: } 235,
  1502. { 122: } 243,
  1503. { 123: } 251,
  1504. { 124: } 251,
  1505. { 125: } 251,
  1506. { 126: } 251,
  1507. { 127: } 251
  1508. );
  1509.  
  1510. yygl : array [0..yynstates-1] of Integer = (
  1511. { 0: } 1,
  1512. { 1: } 3,
  1513. { 2: } 12,
  1514. { 3: } 12,
  1515. { 4: } 12,
  1516. { 5: } 13,
  1517. { 6: } 14,
  1518. { 7: } 15,
  1519. { 8: } 17,
  1520. { 9: } 18,
  1521. { 10: } 19,
  1522. { 11: } 20,
  1523. { 12: } 21,
  1524. { 13: } 21,
  1525. { 14: } 21,
  1526. { 15: } 21,
  1527. { 16: } 21,
  1528. { 17: } 21,
  1529. { 18: } 21,
  1530. { 19: } 21,
  1531. { 20: } 21,
  1532. { 21: } 21,
  1533. { 22: } 22,
  1534. { 23: } 25,
  1535. { 24: } 25,
  1536. { 25: } 25,
  1537. { 26: } 25,
  1538. { 27: } 28,
  1539. { 28: } 29,
  1540. { 29: } 29,
  1541. { 30: } 31,
  1542. { 31: } 33,
  1543. { 32: } 35,
  1544. { 33: } 37,
  1545. { 34: } 37,
  1546. { 35: } 37,
  1547. { 36: } 37,
  1548. { 37: } 39,
  1549. { 38: } 44,
  1550. { 39: } 45,
  1551. { 40: } 45,
  1552. { 41: } 45,
  1553. { 42: } 48,
  1554. { 43: } 48,
  1555. { 44: } 48,
  1556. { 45: } 49,
  1557. { 46: } 54,
  1558. { 47: } 59,
  1559. { 48: } 64,
  1560. { 49: } 69,
  1561. { 50: } 69,
  1562. { 51: } 70,
  1563. { 52: } 70,
  1564. { 53: } 70,
  1565. { 54: } 70,
  1566. { 55: } 72,
  1567. { 56: } 73,
  1568. { 57: } 73,
  1569. { 58: } 73,
  1570. { 59: } 74,
  1571. { 60: } 74,
  1572. { 61: } 76,
  1573. { 62: } 76,
  1574. { 63: } 76,
  1575. { 64: } 76,
  1576. { 65: } 76,
  1577. { 66: } 76,
  1578. { 67: } 76,
  1579. { 68: } 81,
  1580. { 69: } 82,
  1581. { 70: } 82,
  1582. { 71: } 83,
  1583. { 72: } 83,
  1584. { 73: } 83,
  1585. { 74: } 83,
  1586. { 75: } 88,
  1587. { 76: } 93,
  1588. { 77: } 98,
  1589. { 78: } 99,
  1590. { 79: } 99,
  1591. { 80: } 99,
  1592. { 81: } 100,
  1593. { 82: } 101,
  1594. { 83: } 101,
  1595. { 84: } 101,
  1596. { 85: } 101,
  1597. { 86: } 105,
  1598. { 87: } 105,
  1599. { 88: } 105,
  1600. { 89: } 105,
  1601. { 90: } 105,
  1602. { 91: } 106,
  1603. { 92: } 106,
  1604. { 93: } 114,
  1605. { 94: } 116,
  1606. { 95: } 116,
  1607. { 96: } 116,
  1608. { 97: } 117,
  1609. { 98: } 117,
  1610. { 99: } 118,
  1611. { 100: } 118,
  1612. { 101: } 119,
  1613. { 102: } 122,
  1614. { 103: } 122,
  1615. { 104: } 122,
  1616. { 105: } 122,
  1617. { 106: } 122,
  1618. { 107: } 122,
  1619. { 108: } 122,
  1620. { 109: } 122,
  1621. { 110: } 122,
  1622. { 111: } 130,
  1623. { 112: } 130,
  1624. { 113: } 130,
  1625. { 114: } 131,
  1626. { 115: } 132,
  1627. { 116: } 133,
  1628. { 117: } 134,
  1629. { 118: } 135,
  1630. { 119: } 135,
  1631. { 120: } 135,
  1632. { 121: } 135,
  1633. { 122: } 139,
  1634. { 123: } 143,
  1635. { 124: } 147,
  1636. { 125: } 147,
  1637. { 126: } 147,
  1638. { 127: } 147
  1639. );
  1640.  
  1641. yygh : array [0..yynstates-1] of Integer = (
  1642. { 0: } 2,
  1643. { 1: } 11,
  1644. { 2: } 11,
  1645. { 3: } 11,
  1646. { 4: } 12,
  1647. { 5: } 13,
  1648. { 6: } 14,
  1649. { 7: } 16,
  1650. { 8: } 17,
  1651. { 9: } 18,
  1652. { 10: } 19,
  1653. { 11: } 20,
  1654. { 12: } 20,
  1655. { 13: } 20,
  1656. { 14: } 20,
  1657. { 15: } 20,
  1658. { 16: } 20,
  1659. { 17: } 20,
  1660. { 18: } 20,
  1661. { 19: } 20,
  1662. { 20: } 20,
  1663. { 21: } 21,
  1664. { 22: } 24,
  1665. { 23: } 24,
  1666. { 24: } 24,
  1667. { 25: } 24,
  1668. { 26: } 27,
  1669. { 27: } 28,
  1670. { 28: } 28,
  1671. { 29: } 30,
  1672. { 30: } 32,
  1673. { 31: } 34,
  1674. { 32: } 36,
  1675. { 33: } 36,
  1676. { 34: } 36,
  1677. { 35: } 36,
  1678. { 36: } 38,
  1679. { 37: } 43,
  1680. { 38: } 44,
  1681. { 39: } 44,
  1682. { 40: } 44,
  1683. { 41: } 47,
  1684. { 42: } 47,
  1685. { 43: } 47,
  1686. { 44: } 48,
  1687. { 45: } 53,
  1688. { 46: } 58,
  1689. { 47: } 63,
  1690. { 48: } 68,
  1691. { 49: } 68,
  1692. { 50: } 69,
  1693. { 51: } 69,
  1694. { 52: } 69,
  1695. { 53: } 69,
  1696. { 54: } 71,
  1697. { 55: } 72,
  1698. { 56: } 72,
  1699. { 57: } 72,
  1700. { 58: } 73,
  1701. { 59: } 73,
  1702. { 60: } 75,
  1703. { 61: } 75,
  1704. { 62: } 75,
  1705. { 63: } 75,
  1706. { 64: } 75,
  1707. { 65: } 75,
  1708. { 66: } 75,
  1709. { 67: } 80,
  1710. { 68: } 81,
  1711. { 69: } 81,
  1712. { 70: } 82,
  1713. { 71: } 82,
  1714. { 72: } 82,
  1715. { 73: } 82,
  1716. { 74: } 87,
  1717. { 75: } 92,
  1718. { 76: } 97,
  1719. { 77: } 98,
  1720. { 78: } 98,
  1721. { 79: } 98,
  1722. { 80: } 99,
  1723. { 81: } 100,
  1724. { 82: } 100,
  1725. { 83: } 100,
  1726. { 84: } 100,
  1727. { 85: } 104,
  1728. { 86: } 104,
  1729. { 87: } 104,
  1730. { 88: } 104,
  1731. { 89: } 104,
  1732. { 90: } 105,
  1733. { 91: } 105,
  1734. { 92: } 113,
  1735. { 93: } 115,
  1736. { 94: } 115,
  1737. { 95: } 115,
  1738. { 96: } 116,
  1739. { 97: } 116,
  1740. { 98: } 117,
  1741. { 99: } 117,
  1742. { 100: } 118,
  1743. { 101: } 121,
  1744. { 102: } 121,
  1745. { 103: } 121,
  1746. { 104: } 121,
  1747. { 105: } 121,
  1748. { 106: } 121,
  1749. { 107: } 121,
  1750. { 108: } 121,
  1751. { 109: } 121,
  1752. { 110: } 129,
  1753. { 111: } 129,
  1754. { 112: } 129,
  1755. { 113: } 130,
  1756. { 114: } 131,
  1757. { 115: } 132,
  1758. { 116: } 133,
  1759. { 117: } 134,
  1760. { 118: } 134,
  1761. { 119: } 134,
  1762. { 120: } 134,
  1763. { 121: } 138,
  1764. { 122: } 142,
  1765. { 123: } 146,
  1766. { 124: } 146,
  1767. { 125: } 146,
  1768. { 126: } 146,
  1769. { 127: } 146
  1770. );
  1771.  
  1772. yyr : array [1..yynrules] of YYRRec = (
  1773. { 1: } ( len: 1; sym: -3 ),
  1774. { 2: } ( len: 1; sym: -4 ),
  1775. { 3: } ( len: 1; sym: -5 ),
  1776. { 4: } ( len: 1; sym: -6 ),
  1777. { 5: } ( len: 1; sym: -7 ),
  1778. { 6: } ( len: 1; sym: -8 ),
  1779. { 7: } ( len: 1; sym: -9 ),
  1780. { 8: } ( len: 1; sym: -10 ),
  1781. { 9: } ( len: 1; sym: -11 ),
  1782. { 10: } ( len: 1; sym: -12 ),
  1783. { 11: } ( len: 1; sym: -13 ),
  1784. { 12: } ( len: 1; sym: -14 ),
  1785. { 13: } ( len: 1; sym: -15 ),
  1786. { 14: } ( len: 1; sym: -16 ),
  1787. { 15: } ( len: 1; sym: -17 ),
  1788. { 16: } ( len: 1; sym: -17 ),
  1789. { 17: } ( len: 1; sym: -18 ),
  1790. { 18: } ( len: 1; sym: -19 ),
  1791. { 19: } ( len: 1; sym: -20 ),
  1792. { 20: } ( len: 1; sym: -21 ),
  1793. { 21: } ( len: 1; sym: -22 ),
  1794. { 22: } ( len: 1; sym: -23 ),
  1795. { 23: } ( len: 1; sym: -23 ),
  1796. { 24: } ( len: 1; sym: -24 ),
  1797. { 25: } ( len: 1; sym: -25 ),
  1798. { 26: } ( len: 1; sym: -25 ),
  1799. { 27: } ( len: 1; sym: -26 ),
  1800. { 28: } ( len: 0; sym: -29 ),
  1801. { 29: } ( len: 0; sym: -31 ),
  1802. { 30: } ( len: 6; sym: -2 ),
  1803. { 31: } ( len: 0; sym: -30 ),
  1804. { 32: } ( len: 1; sym: -30 ),
  1805. { 33: } ( len: 0; sym: -27 ),
  1806. { 34: } ( len: 2; sym: -27 ),
  1807. { 35: } ( len: 2; sym: -27 ),
  1808. { 36: } ( len: 2; sym: -32 ),
  1809. { 37: } ( len: 2; sym: -32 ),
  1810. { 38: } ( len: 0; sym: -33 ),
  1811. { 39: } ( len: 3; sym: -32 ),
  1812. { 40: } ( len: 0; sym: -35 ),
  1813. { 41: } ( len: 4; sym: -32 ),
  1814. { 42: } ( len: 0; sym: -37 ),
  1815. { 43: } ( len: 4; sym: -32 ),
  1816. { 44: } ( len: 0; sym: -38 ),
  1817. { 45: } ( len: 4; sym: -32 ),
  1818. { 46: } ( len: 0; sym: -39 ),
  1819. { 47: } ( len: 4; sym: -32 ),
  1820. { 48: } ( len: 3; sym: -32 ),
  1821. { 49: } ( len: 2; sym: -32 ),
  1822. { 50: } ( len: 0; sym: -34 ),
  1823. { 51: } ( len: 3; sym: -34 ),
  1824. { 52: } ( len: 1; sym: -36 ),
  1825. { 53: } ( len: 2; sym: -36 ),
  1826. { 54: } ( len: 3; sym: -36 ),
  1827. { 55: } ( len: 1; sym: -36 ),
  1828. { 56: } ( len: 2; sym: -36 ),
  1829. { 57: } ( len: 3; sym: -36 ),
  1830. { 58: } ( len: 1; sym: -41 ),
  1831. { 59: } ( len: 1; sym: -41 ),
  1832. { 60: } ( len: 1; sym: -41 ),
  1833. { 61: } ( len: 2; sym: -41 ),
  1834. { 62: } ( len: 2; sym: -41 ),
  1835. { 63: } ( len: 1; sym: -40 ),
  1836. { 64: } ( len: 2; sym: -40 ),
  1837. { 65: } ( len: 3; sym: -40 ),
  1838. { 66: } ( len: 1; sym: -40 ),
  1839. { 67: } ( len: 2; sym: -40 ),
  1840. { 68: } ( len: 3; sym: -40 ),
  1841. { 69: } ( len: 1; sym: -42 ),
  1842. { 70: } ( len: 0; sym: -44 ),
  1843. { 71: } ( len: 2; sym: -28 ),
  1844. { 72: } ( len: 0; sym: -45 ),
  1845. { 73: } ( len: 0; sym: -46 ),
  1846. { 74: } ( len: 5; sym: -28 ),
  1847. { 75: } ( len: 2; sym: -28 ),
  1848. { 76: } ( len: 1; sym: -28 ),
  1849. { 77: } ( len: 2; sym: -28 ),
  1850. { 78: } ( len: 0; sym: -48 ),
  1851. { 79: } ( len: 0; sym: -50 ),
  1852. { 80: } ( len: 6; sym: -43 ),
  1853. { 81: } ( len: 1; sym: -47 ),
  1854. { 82: } ( len: 0; sym: -52 ),
  1855. { 83: } ( len: 4; sym: -47 ),
  1856. { 84: } ( len: 0; sym: -49 ),
  1857. { 85: } ( len: 2; sym: -49 ),
  1858. { 86: } ( len: 2; sym: -49 ),
  1859. { 87: } ( len: 2; sym: -49 ),
  1860. { 88: } ( len: 2; sym: -49 ),
  1861. { 89: } ( len: 2; sym: -49 ),
  1862. { 90: } ( len: 0; sym: -54 ),
  1863. { 91: } ( len: 3; sym: -53 ),
  1864. { 92: } ( len: 1; sym: -53 ),
  1865. { 93: } ( len: 0; sym: -51 ),
  1866. { 94: } ( len: 0; sym: -56 ),
  1867. { 95: } ( len: 4; sym: -51 ),
  1868. { 96: } ( len: 0; sym: -57 ),
  1869. { 97: } ( len: 4; sym: -51 ),
  1870. { 98: } ( len: 0; sym: -58 ),
  1871. { 99: } ( len: 4; sym: -51 ),
  1872. { 100: } ( len: 2; sym: -51 ),
  1873. { 101: } ( len: 0; sym: -55 ),
  1874. { 102: } ( len: 1; sym: -55 )
  1875. );
  1876.  
  1877.  
  1878. const _error = 256; (* error token *)
  1879.  
  1880. function yyact(state, sym : Integer; var act : Integer) : Boolean;
  1881.   (* search action table *)
  1882.   var k : Integer;
  1883.   begin
  1884.     k := yyal[state];
  1885.     while (k<=yyah[state]) and (yya[k].sym<>sym) do inc(k);
  1886.     if k>yyah[state] then
  1887.       yyact := false
  1888.     else
  1889.       begin
  1890.         act := yya[k].act;
  1891.         yyact := true;
  1892.       end;
  1893.   end(*yyact*);
  1894.  
  1895. function yygoto(state, sym : Integer; var nstate : Integer) : Boolean;
  1896.   (* search goto table *)
  1897.   var k : Integer;
  1898.   begin
  1899.     k := yygl[state];
  1900.     while (k<=yygh[state]) and (yyg[k].sym<>sym) do inc(k);
  1901.     if k>yygh[state] then
  1902.       yygoto := false
  1903.     else
  1904.       begin
  1905.         nstate := yyg[k].act;
  1906.         yygoto := true;
  1907.       end;
  1908.   end(*yygoto*);
  1909.  
  1910. label parse, next, error, errlab, shift, reduce, accept, abort;
  1911.  
  1912. begin(*yyparse*)
  1913.  
  1914.   (* initialize: *)
  1915.  
  1916.   yystate := 0; yychar := -1; yynerrs := 0; yyerrflag := 0; yysp := 0;
  1917.  
  1918. {$ifdef yydebug}
  1919.   yydebug := true;
  1920. {$else}
  1921.   yydebug := false;
  1922. {$endif}
  1923.  
  1924. parse:
  1925.  
  1926.   (* push state and value: *)
  1927.  
  1928.   inc(yysp);
  1929.   if yysp>yymaxdepth then
  1930.     begin
  1931.       yyerror('yyparse stack overflow');
  1932.       goto abort;
  1933.     end;
  1934.   yys[yysp] := yystate; yyv[yysp] := yyval;
  1935.  
  1936. next:
  1937.  
  1938.   if (yyd[yystate]=0) and (yychar=-1) then
  1939.     (* get next symbol *)
  1940.     begin
  1941.       yychar := yylex; if yychar<0 then yychar := 0;
  1942.     end;
  1943.  
  1944.   if yydebug then writeln('state ', yystate, ', char ', yychar);
  1945.  
  1946.   (* determine parse action: *)
  1947.  
  1948.   yyn := yyd[yystate];
  1949.   if yyn<>0 then goto reduce; (* simple state *)
  1950.  
  1951.   (* no default action; search parse table *)
  1952.  
  1953.   if not yyact(yystate, yychar, yyn) then goto error
  1954.   else if yyn>0 then                      goto shift
  1955.   else if yyn<0 then                      goto reduce
  1956.   else                                    goto accept;
  1957.  
  1958. error:
  1959.  
  1960.   (* error; start error recovery: *)
  1961.  
  1962.   if yyerrflag=0 then yyerror('syntax error');
  1963.  
  1964. errlab:
  1965.  
  1966.   if yyerrflag=0 then inc(yynerrs);     (* new error *)
  1967.  
  1968.   if yyerrflag<=2 then                  (* incomplete recovery; try again *)
  1969.     begin
  1970.       yyerrflag := 3;
  1971.       (* uncover a state with shift action on error token *)
  1972.       while (yysp>0) and not ( yyact(yys[yysp], _error, yyn) and
  1973.                                (yyn>0) ) do
  1974.         begin
  1975.           if yydebug then
  1976.             if yysp>1 then
  1977.               writeln('error recovery pops state ', yys[yysp], ', uncovers ',
  1978.                       yys[yysp-1])
  1979.             else
  1980.               writeln('error recovery fails ... abort');
  1981.           dec(yysp);
  1982.         end;
  1983.       if yysp=0 then goto abort; (* parser has fallen from stack; abort *)
  1984.       yystate := yyn;            (* simulate shift on error *)
  1985.       goto parse;
  1986.     end
  1987.   else                                  (* no shift yet; discard symbol *)
  1988.     begin
  1989.       if yydebug then writeln('error recovery discards char ', yychar);
  1990.       if yychar=0 then goto abort; (* end of input; abort *)
  1991.       yychar := -1; goto next;     (* clear lookahead char and try again *)
  1992.     end;
  1993.  
  1994. shift:
  1995.  
  1996.   (* go to new state, clear lookahead character: *)
  1997.  
  1998.   yystate := yyn; yychar := -1; yyval := yylval;
  1999.   if yyerrflag>0 then dec(yyerrflag);
  2000.  
  2001.   goto parse;
  2002.  
  2003. reduce:
  2004.  
  2005.   (* execute action, pop rule from stack, and go to next state: *)
  2006.  
  2007.   if yydebug then writeln('reduce ', -yyn);
  2008.  
  2009.   yyflag := yyfnone; yyaction(-yyn);
  2010.   dec(yysp, yyr[-yyn].len);
  2011.   if yygoto(yys[yysp], yyr[-yyn].sym, yyn) then yystate := yyn;
  2012.  
  2013.   (* handle action calls to yyaccept, yyabort and yyerror: *)
  2014.  
  2015.   case yyflag of
  2016.     yyfaccept : goto accept;
  2017.     yyfabort  : goto abort;
  2018.     yyferror  : goto errlab;
  2019.   end;
  2020.  
  2021.   goto parse;
  2022.  
  2023. accept:
  2024.  
  2025.   yyparse := 0; exit;
  2026.  
  2027. abort:
  2028.  
  2029.   yyparse := 1; exit;
  2030.  
  2031. end(*yyparse*);
  2032.  
  2033.  
  2034. (* Lexical analyzer (implemented in Turbo Pascal for maximum efficiency): *)
  2035.  
  2036. function yylex : integer;
  2037.   function end_of_input : boolean;
  2038.     begin
  2039.       end_of_input := (cno>length(line)) and eof(yyin)
  2040.     end(*end_of_input*);
  2041.   procedure scan;
  2042.     (* scan for nonempty character, skip comments *)
  2043.     procedure scan_comment;
  2044.       var p : integer;
  2045.       begin
  2046.         p := pos('*/', copy(line, cno, length(line)));
  2047.         if p>0 then
  2048.           cno := cno+succ(p)
  2049.         else
  2050.           begin
  2051.             while (p=0) and not eof(yyin) do
  2052.               begin
  2053.                 readln(yyin, line);
  2054.                 inc(lno);
  2055.                 p := pos('*/', line)
  2056.               end;
  2057.             if p=0 then
  2058.               begin
  2059.                 cno := succ(length(line));
  2060.                 error(open_comment_at_eof);
  2061.               end
  2062.             else
  2063.               cno := succ(succ(p))
  2064.           end
  2065.       end(*scan_comment*);
  2066.     begin
  2067.       while not end_of_input do
  2068.         if cno<=length(line) then
  2069.           case line[cno] of
  2070.             ' ', tab : inc(cno);
  2071.             '/' :
  2072.               if (cno<length(line)) and (line[succ(cno)]='*') then
  2073.                 begin
  2074.                   inc(cno, 2);
  2075.                   scan_comment
  2076.                 end
  2077.               else
  2078.                 exit
  2079.             else
  2080.               exit
  2081.           end
  2082.         else
  2083.           begin
  2084.             readln(yyin, line);
  2085.             inc(lno); cno := 1;
  2086.           end
  2087.     end(*scan*);
  2088.   function scan_ident : integer;
  2089.     (* scan an identifier *)
  2090.     var
  2091.       idstr : String;
  2092.     begin
  2093.       idstr := line[cno];
  2094.       inc(cno);
  2095.       while (cno<=length(line)) and (
  2096.             ('A'<=upCase(line[cno])) and (upCase(line[cno])<='Z') or
  2097.             ('0'<=line[cno]) and (line[cno]<='9') or
  2098.             (line[cno]='_') or
  2099.             (line[cno]='.') ) do
  2100.     begin
  2101.       idstr := idstr+line[cno];
  2102.       inc(cno)
  2103.     end;
  2104.       yylval := get_key(idstr);
  2105.       scan;
  2106.       if not end_of_input and (line[cno]=':') then
  2107.         scan_ident := C_ID
  2108.       else
  2109.         scan_ident := ID
  2110.     end(*scan_ident*);
  2111.   function scan_literal: integer;
  2112.     (* scan a literal, i.e. string *)
  2113.     var
  2114.       idstr : String;
  2115.       oct_val : Byte;
  2116.     begin
  2117.       idstr := line[cno];
  2118.       inc(cno);
  2119.       while (cno<=length(line)) and (line[cno]<>idstr[1]) do
  2120.         if line[cno]='\' then
  2121.           if cno<length(line) then
  2122.             begin
  2123.               inc(cno);
  2124.               case line[cno] of
  2125.                 'n' :
  2126.                   begin
  2127.                     idstr := idstr+nl;
  2128.                     inc(cno)
  2129.                   end;
  2130.                 'r' :
  2131.                   begin
  2132.                     idstr := idstr+cr;
  2133.                     inc(cno)
  2134.                   end;
  2135.                 't' :
  2136.                   begin
  2137.                     idstr := idstr+tab;
  2138.                     inc(cno)
  2139.                   end;
  2140.                 'b' :
  2141.                   begin
  2142.                     idstr := idstr+bs;
  2143.                     inc(cno)
  2144.                   end;
  2145.                 'f' :
  2146.                   begin
  2147.                     idstr := idstr+ff;
  2148.                     inc(cno)
  2149.                   end;
  2150.                 '0'..'7' :
  2151.                   begin
  2152.                     oct_val := ord(line[cno])-ord('0');
  2153.                     inc(cno);
  2154.                     while (cno<=length(line)) and
  2155.                           ('0'<=line[cno]) and
  2156.                           (line[cno]<='7') do
  2157.                       begin
  2158.                         oct_val := oct_val*8+ord(line[cno])-ord('0');
  2159.                         inc(cno)
  2160.                       end;
  2161.                     idstr := idstr+chr(oct_val)
  2162.                   end
  2163.                 else
  2164.                   begin
  2165.                     idstr := idstr+line[cno];
  2166.                     inc(cno)
  2167.                   end
  2168.               end
  2169.             end
  2170.           else
  2171.             inc(cno)
  2172.         else
  2173.           begin
  2174.             idstr := idstr+line[cno];
  2175.             inc(cno)
  2176.           end;
  2177.       if cno>length(line) then
  2178.         error(missing_string_terminator)
  2179.       else
  2180.         inc(cno);
  2181.       if length(idstr)=2 then
  2182.         begin
  2183.           yylval := ord(idstr[2]);
  2184.           scan_literal := LITERAL;
  2185.         end
  2186.       else if length(idstr)>1 then
  2187.         begin
  2188.           yylval := get_key(''''+copy(idstr, 2, pred(length(idstr)))+'''');
  2189.           scan_literal := LITID;
  2190.         end
  2191.       else
  2192.         scan_literal := ILLEGAL;
  2193.     end(*scan_literal*);
  2194.   function scan_num : integer;
  2195.     (* scan an unsigned integer *)
  2196.     var
  2197.       numstr : String;
  2198.       code : integer;
  2199.     begin
  2200.       numstr := line[cno];
  2201.       inc(cno);
  2202.       while (cno<=length(line)) and
  2203.             ('0'<=line[cno]) and (line[cno]<='9') do
  2204.         begin
  2205.           numstr := numstr+line[cno];
  2206.           inc(cno)
  2207.         end;
  2208.       val(numstr, yylval, code);
  2209.       if code=0 then
  2210.         scan_num := NUMBER
  2211.       else
  2212.         scan_num := ILLEGAL;
  2213.     end(*scan_num*);
  2214.   function scan_keyword : integer;
  2215.     (* scan %xy *)
  2216.     function lookup(key : String; var tok : integer) : boolean;
  2217.       (* table of Yacc keywords (unstropped): *)
  2218.       const
  2219.         no_of_entries = 11;
  2220.         max_entry_length = 8;
  2221.         keys : array [1..no_of_entries] of String[max_entry_length] = (
  2222.           '0', '2', 'binary', 'left', 'nonassoc', 'prec', 'right',
  2223.           'start', 'term', 'token', 'type');
  2224.         toks : array [1..no_of_entries] of integer = (
  2225.           PTOKEN, PNONASSOC, PNONASSOC, PLEFT, PNONASSOC, PPREC, PRIGHT,
  2226.           PSTART, PTOKEN, PTOKEN, PTYPE);
  2227.       var m, n, k : integer;
  2228.       begin
  2229.         (* binary search: *)
  2230.         m := 1; n := no_of_entries;
  2231.         lookup := true;
  2232.         while m<=n do
  2233.           begin
  2234.             k := m+(n-m) div 2;
  2235.             if key=keys[k] then
  2236.               begin
  2237.                 tok := toks[k];
  2238.                 exit
  2239.               end
  2240.             else if key>keys[k] then
  2241.               m := k+1
  2242.             else
  2243.               n := k-1
  2244.           end;
  2245.         lookup := false
  2246.       end(*lookup*);
  2247.     var
  2248.       keywstr : String;
  2249.       tok : integer;
  2250.     begin
  2251.       inc(cno);
  2252.       if cno<=length(line) then
  2253.         case line[cno] of
  2254.           '<' :
  2255.             begin
  2256.               scan_keyword := PLEFT;
  2257.               inc(cno)
  2258.             end;
  2259.           '>' :
  2260.             begin
  2261.               scan_keyword := PRIGHT;
  2262.               inc(cno)
  2263.             end;
  2264.           '=' :
  2265.             begin
  2266.               scan_keyword := PPREC;
  2267.               inc(cno)
  2268.             end;
  2269.           '%', '\' :
  2270.             begin
  2271.               scan_keyword := PP;
  2272.               inc(cno)
  2273.             end;
  2274.           '{' :
  2275.             begin
  2276.               scan_keyword := LCURL;
  2277.               inc(cno)
  2278.             end;
  2279.           '}' :
  2280.             begin
  2281.               scan_keyword := RCURL;
  2282.               inc(cno)
  2283.             end;
  2284.           'A'..'Z', 'a'..'z', '0'..'9' :
  2285.             begin
  2286.               keywstr := line[cno];
  2287.               inc(cno);
  2288.               while (cno<=length(line)) and (
  2289.                     ('A'<=upCase(line[cno])) and (upCase(line[cno])<='Z') or
  2290.                     ('0'<=line[cno]) and (line[cno]<='Z') ) do
  2291.                 begin
  2292.                   keywstr := keywstr+line[cno];
  2293.                   inc(cno)
  2294.                 end;
  2295.               if lookup(keywstr, tok) then
  2296.                 scan_keyword := tok
  2297.               else
  2298.                 scan_keyword := ILLEGAL
  2299.             end;
  2300.           else scan_keyword := ILLEGAL
  2301.         end
  2302.       else
  2303.         scan_keyword := ILLEGAL;
  2304.     end(*scan_keyword*);
  2305.   function scan_char : integer;
  2306.     (* scan any single character *)
  2307.     begin
  2308.       scan_char := ord(line[cno]);
  2309.       inc(cno)
  2310.     end(*scan_char*);
  2311.   var lno0, cno0 : integer;
  2312.   begin
  2313.     tokleng := 0;
  2314.     scan;
  2315.     lno0 := lno; cno0 := cno;
  2316.     if end_of_input then
  2317.       yylex := 0
  2318.     else
  2319.       case line[cno] of
  2320.         'A'..'Z', 'a'..'z', '_' : yylex := scan_ident;
  2321.     '''', '"' : yylex := scan_literal;
  2322.     '0'..'9' : yylex := scan_num;
  2323.     '%', '\' : yylex := scan_keyword;
  2324.         '=' :
  2325.           if (cno<length(line)) and (line[succ(cno)]='{') then
  2326.             begin
  2327.               inc(cno);
  2328.               yylex := scan_char
  2329.             end
  2330.           else
  2331.             yylex := scan_char;
  2332.     else yylex := scan_char;
  2333.       end;
  2334.     if lno=lno0 then
  2335.       tokleng := cno-cno0
  2336.   end(*yylex*);
  2337.  
  2338. (* Main program: *)
  2339.  
  2340. var i : Integer;
  2341.  
  2342. begin
  2343.  
  2344.   (* sign-on: *)
  2345.  
  2346.   writeln(sign_on);
  2347.  
  2348.   (* parse command line: *)
  2349.  
  2350.   if paramCount=0 then
  2351.     begin
  2352.       writeln(usage);
  2353.       writeln(options);
  2354.       halt(0);
  2355.     end;
  2356.  
  2357.   yfilename := '';
  2358.   pasfilename := '';
  2359.  
  2360.   for i := 1 to paramCount do
  2361.     if copy(paramStr(i), 1, 1)='/' then
  2362.       if upper(paramStr(i))='/V' then
  2363.         verbose := true
  2364.       else if upper(paramStr(i))='/D' then
  2365.         debug := true
  2366.       else
  2367.         begin
  2368.           writeln(invalid_option, paramStr(i));
  2369.           halt(1);
  2370.         end
  2371.     else if yfilename='' then
  2372.       yfilename := addExt(upper(paramStr(i)), 'Y')
  2373.     else if pasfilename='' then
  2374.       pasfilename := addExt(upper(paramStr(i)), 'PAS')
  2375.     else
  2376.       begin
  2377.         writeln(illegal_no_args);
  2378.         halt(1);
  2379.       end;
  2380.  
  2381.   if yfilename='' then
  2382.     begin
  2383.       writeln(illegal_no_args);
  2384.       halt(1);
  2385.     end;
  2386.  
  2387.   if pasfilename='' then pasfilename := root(yfilename)+'.PAS';
  2388.   lstfilename := root(yfilename)+'.LST';
  2389.  
  2390.   (* open files: *)
  2391.  
  2392.   assign(yyin, yfilename);
  2393.   assign(yyout, pasfilename);
  2394.   assign(yylst, lstfilename);
  2395.  
  2396.   reset(yyin);    if ioresult<>0 then fatal(cannot_open_file+yfilename);
  2397.   rewrite(yyout); if ioresult<>0 then fatal(cannot_open_file+pasfilename);
  2398.   rewrite(yylst); if ioresult<>0 then fatal(cannot_open_file+lstfilename);
  2399.  
  2400.   (* search code template in current directory, then on path where Yacc
  2401.      was executed from: *)
  2402.   codfilename := 'YYPARSE.COD';
  2403.   assign(yycod, codfilename);
  2404.   reset(yycod);
  2405.   if ioresult<>0 then
  2406.     begin
  2407.       codfilename := upper(path(paramStr(0)))+'YYPARSE.COD';
  2408.       assign(yycod, codfilename);
  2409.       reset(yycod);
  2410.       if ioresult<>0 then fatal(cannot_open_file+codfilename);
  2411.     end;
  2412.  
  2413.   (* parse source grammar: *)
  2414.  
  2415.   write('parse ... ');
  2416.  
  2417.   lno := 0; cno := 1; line := '';
  2418.  
  2419.   next_section;
  2420.   if debug then writeln(yyout, '{$define yydebug}');
  2421.  
  2422.   if yyparse=0 then
  2423.     { done }
  2424.   else if yychar=0 then
  2425.     error(unexpected_eof)
  2426.   else
  2427.     error(syntax_error);
  2428.  
  2429.   if errors=0 then writeln('DONE');
  2430.  
  2431.   (* close files: *)
  2432.  
  2433.   close(yyin); close(yyout); close(yylst); close(yycod);
  2434.  
  2435.   (* print statistics: *)
  2436.  
  2437.   if errors>0 then
  2438.     writeln( lno, ' lines, ',
  2439.              errors, ' errors found.' )
  2440.   else
  2441.     begin
  2442.       writeln( lno, ' lines, ',
  2443.                n_rules-1, '/', max_rules-1, ' rules, ',
  2444.                n_states, '/', max_states, ' s, ',
  2445.                n_items, '/', max_items, ' i, ',
  2446.                n_trans, '/', max_trans, ' t, ',
  2447.                n_redns, '/', max_redns, ' r.');
  2448.       if shift_reduce>0 then
  2449.         writeln(shift_reduce, ' shift/reduce conflicts.');
  2450.       if reduce_reduce>0 then
  2451.         writeln(reduce_reduce, ' reduce/reduce conflicts.');
  2452.       if never_reduced>0 then
  2453.         writeln(never_reduced, ' rules never reduced.');
  2454.     end;
  2455.  
  2456.   if warnings>0 then writeln(warnings, ' warnings.');
  2457.  
  2458.   writeln( n_bytes, '/', max_bytes, ' bytes of memory used.');
  2459.  
  2460.   (* terminate: *)
  2461.  
  2462.   if errors>0 then
  2463.     begin
  2464.       erase(yyout);
  2465.       if ioresult<>0 then ;
  2466.     end;
  2467.  
  2468.   if file_size(lstfilename)=0 then
  2469.     erase(yylst)
  2470.   else
  2471.     writeln('(see ', lstfilename, ' for more information)');
  2472.  
  2473.   halt(errors);
  2474.  
  2475. end(*Yacc*).